package co.edu.dataaccess.dao;

import co.edu.dataaccess.entityManager.EntityManagerHelper;

import co.edu.usbcali.modeloo.SubactividadPorActividad;

import java.math.BigDecimal;

import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;

import javax.persistence.EntityManager;
import javax.persistence.Query;


/**
 * A data access object (DAO) providing persistence and search support for
 * SubactividadPorActividad entities. Transaction control of the save(), update() and delete()
 * operations must be handled externally by senders of these methods or must be
 * manually added to each of these methods for data to be persisted to the JPA
 * datastore.
 *
 * @see lidis.SubactividadPorActividad
 */
public class SubactividadPorActividadDAO implements ISubactividadPorActividadDAO {
    // property constants

    //public static final Integer  AMBITOSDEASIGNACION2 = "ambitosdeasignacion2";
    public static final String AMBITOSDEASIGNACION2 = "ambitosdeasignacion2";

    //public static final Integer  AMBITOSDEASIGNACIONENPF = "ambitosdeasignacionenpf";
    public static final String AMBITOSDEASIGNACIONENPF = "ambitosdeasignacionenpf";

    //public static final Integer  DEFECTOSDEALTASEVERIDAD = "defectosdealtaseveridad";
    public static final String DEFECTOSDEALTASEVERIDAD = "defectosdealtaseveridad";

    //public static final Integer  DEFECTOSENTREGADOS = "defectosentregados";
    public static final String DEFECTOSENTREGADOS = "defectosentregados";

    //public static final Integer  DEFECTOSENTREGADOS2 = "defectosentregados2";
    public static final String DEFECTOSENTREGADOS2 = "defectosentregados2";

    //public static final Integer  ELIMINACIONDEDEFECTOS = "eliminaciondedefectos";
    public static final String ELIMINACIONDEDEFECTOS = "eliminaciondedefectos";

    //public static final Date  FECHAESTIMADASUBACTFIN = "fechaestimadasubactFin";
    public static final String FECHAESTIMADASUBACTFIN = "fechaestimadasubactFin";

    //public static final Date  FECHAESTIMADASUBACTINICIO = "fechaestimadasubactInicio";
    public static final String FECHAESTIMADASUBACTINICIO = "fechaestimadasubactInicio";

    //public static final Date  FECHALIMITEESTIMADA = "fechalimiteestimada";
    public static final String FECHALIMITEESTIMADA = "fechalimiteestimada";

    //public static final Integer  ID = "id";
    public static final String ID = "id";

    //public static final Integer  INDICEDEPRODUCCIONPF = "indicedeproduccionpf";
    public static final String INDICEDEPRODUCCIONPF = "indicedeproduccionpf";

    //public static final Integer  INDICEDEPRODUCCIONPF2 = "indicedeproduccionpf2";
    public static final String INDICEDEPRODUCCIONPF2 = "indicedeproduccionpf2";

    //public static final Integer  INDICEINCREMENTOCAMBIOMENSUAL = "indiceincrementocambiomensual";
    public static final String INDICEINCREMENTOCAMBIOMENSUAL = "indiceincrementocambiomensual";

    //public static final Integer  POTENCIALDEDEFECTOS1 = "potencialdedefectos1";
    public static final String POTENCIALDEDEFECTOS1 = "potencialdedefectos1";

    //public static final Integer  POTENCIALDEDEFECTOS2 = "potencialdedefectos2";
    public static final String POTENCIALDEDEFECTOS2 = "potencialdedefectos2";

    //public static final Integer  PROBABILIDADDEREPARACIONESDEFECTUOSAS = "probabilidaddereparacionesdefectuosas";
    public static final String PROBABILIDADDEREPARACIONESDEFECTUOSAS = "probabilidaddereparacionesdefectuosas";

    //public static final Integer  REUTILIZACION = "reutilizacion";
    public static final String REUTILIZACION = "reutilizacion";

    //public static final Integer  TAMANODEREQUISITOSENCASOSDEUSO = "tamanoderequisitosencasosdeuso";
    public static final String TAMANODEREQUISITOSENCASOSDEUSO = "tamanoderequisitosencasosdeuso";

    //public static final Integer  TAMANOINICIALDESUBACTV1 = "tamanoinicialdesubactv1";
    public static final String TAMANOINICIALDESUBACTV1 = "tamanoinicialdesubactv1";

    //public static final Integer  TAMANOINICIALDESUBACTV2 = "tamanoinicialdesubactv2";
    public static final String TAMANOINICIALDESUBACTV2 = "tamanoinicialdesubactv2";

    //public static final Integer  VOLUMENESDEGRAFICOS = "volumenesdegraficos";
    public static final String VOLUMENESDEGRAFICOS = "volumenesdegraficos";

    private EntityManager getEntityManager() {
        return EntityManagerHelper.getEntityManager();
    }

    /**
     * Perform an initial save of a previously unsaved SubactividadPorActividad entity. All
     * subsequent persist actions of this entity should use the #update()
     * method. This operation must be performed within the a database
     * transaction context for the entity's data to be permanently saved to the
     * persistence store, i.e., database. This method uses the
     * {@link javax.persistence.EntityManager#persist(Object) EntityManager#persist}
     * operation.
     *
     * <pre>
     * EntityManagerHelper.beginTransaction();
     * SubactividadPorActividadDAO.save(entity);
     * EntityManagerHelper.commit();
     * </pre>
     *
     * @param entity
     *            SubactividadPorActividad entity to persist
     * @throws RuntimeException
     *             when the operation fails
     */
    public void save(SubactividadPorActividad entity) {
        EntityManagerHelper.log("saving SubactividadPorActividad instance",
            Level.INFO, null);

        try {
            getEntityManager().persist(entity);
            EntityManagerHelper.log("save successful", Level.INFO, null);
        } catch (RuntimeException re) {
            EntityManagerHelper.log("save failed", Level.SEVERE, re);
            throw re;
        }
    }

    /**
     * Delete a persistent SubactividadPorActividad entity. This operation must be performed
     * within the a database transaction context for the entity's data to be
     * permanently deleted from the persistence store, i.e., database. This
     * method uses the
     * {@link javax.persistence.EntityManager#remove(Object) EntityManager#delete}
     * operation.
     *
     * <pre>
     * EntityManagerHelper.beginTransaction();
     * SubactividadPorActividadDAO.delete(entity);
     * EntityManagerHelper.commit();
     * entity = null;
     * </pre>
     *
     * @param entity
     *            SubactividadPorActividad entity to delete
     * @throws RuntimeException
     *             when the operation fails
     */
    public void delete(SubactividadPorActividad entity) {
        EntityManagerHelper.log("deleting SubactividadPorActividad instance",
            Level.INFO, null);

        try {
            entity = getEntityManager()
                         .getReference(SubactividadPorActividad.class,
                    entity.getId());
            getEntityManager().remove(entity);
            EntityManagerHelper.log("delete successful", Level.INFO, null);
        } catch (RuntimeException re) {
            EntityManagerHelper.log("delete failed", Level.SEVERE, re);
            throw re;
        }
    }

    /**
     * Persist a previously saved SubactividadPorActividad entity and return it or a copy of it
     * to the sender. A copy of the SubactividadPorActividad entity parameter is returned when
     * the JPA persistence mechanism has not previously been tracking the
     * updated entity. This operation must be performed within the a database
     * transaction context for the entity's data to be permanently saved to the
     * persistence store, i.e., database. This method uses the
     * {@link javax.persistence.EntityManager#merge(Object) EntityManager#merge}
     * operation.
     *
     * <pre>
     * EntityManagerHelper.beginTransaction();
     * entity = SubactividadPorActividadDAO.update(entity);
     * EntityManagerHelper.commit();
     * </pre>
     *
     * @param entity
     *            SubactividadPorActividad entity to update
     * @return SubactividadPorActividad the persisted SubactividadPorActividad entity instance, may not be the
     *         same
     * @throws RuntimeException
     *             if the operation fails
     */
    public SubactividadPorActividad update(SubactividadPorActividad entity) {
        EntityManagerHelper.log("updating SubactividadPorActividad instance",
            Level.INFO, null);

        try {
            SubactividadPorActividad result = getEntityManager()
                                                  .merge(entity);
            EntityManagerHelper.log("update successful", Level.INFO, null);

            return result;
        } catch (RuntimeException re) {
            EntityManagerHelper.log("update failed", Level.SEVERE, re);
            throw re;
        }
    }

    public SubactividadPorActividad findById(Integer id) {
        EntityManagerHelper.log(
            "finding SubactividadPorActividad instance with id: " + id,
            Level.INFO, null);

        try {
            SubactividadPorActividad instance = getEntityManager()
                                                    .find(SubactividadPorActividad.class,
                    id);

            return instance;
        } catch (RuntimeException re) {
            EntityManagerHelper.log("find failed", Level.SEVERE, re);
            throw re;
        }
    }

    /**
     * Find all  SubactividadPorActividad entities with a specific property value.
     *
     * @param propertyName
     *            the metaData.name of the  SubactividadPorActividad property to query
     * @param value
     *            the property value to match
     * @return List< SubactividadPorActividad> found by query
     */
    @SuppressWarnings("unchecked")
    public List<SubactividadPorActividad> findByProperty(String propertyName,
        final Object value) {
        EntityManagerHelper.log(
            "finding  SubactividadPorActividad instance with property: " +
            propertyName + ", value: " + value, Level.INFO, null);

        try {
            final String queryString = "select model from  SubactividadPorActividad model where model." +
                propertyName + "= :propertyValue";
            Query query = getEntityManager().createQuery(queryString);
            query.setParameter("propertyValue", value);

            return query.getResultList();
        } catch (RuntimeException re) {
            EntityManagerHelper.log("find by property metaData.name failed",
                Level.SEVERE, re);
            throw re;
        }
    }

    /**
     * Find all SubactividadPorActividad entities with a specific property value.
     *
     * @param propertyName
     *            the name of the SubactividadPorActividad property to query
     * @param value
     *            the property value to match
     * @param rowStartIdxAndCount
     *            Optional int varargs. rowStartIdxAndCount[0] specifies the the
     *            row index in the query result-set to begin collecting the
     *            results. rowStartIdxAndCount[1] specifies the the maximum
     *            number of results to return.
     * @return List<SubactividadPorActividad> found by query
     */
    @SuppressWarnings("unchecked")
    public List<SubactividadPorActividad> findByProperty(String propertyName,
        final Object value, final int... rowStartIdxAndCount) {
        EntityManagerHelper.log(
            "finding SubactividadPorActividad instance with property: " +
            propertyName + ", value: " + value, Level.INFO, null);

        try {
            final String queryString = "select model from SubactividadPorActividad model where model." +
                propertyName + "= :propertyValue";
            Query query = getEntityManager().createQuery(queryString);
            query.setParameter("propertyValue", value);

            if ((rowStartIdxAndCount != null) &&
                    (rowStartIdxAndCount.length > 0)) {
                int rowStartIdx = Math.max(0, rowStartIdxAndCount[0]);

                if (rowStartIdx > 0) {
                    query.setFirstResult(rowStartIdx);
                }

                if (rowStartIdxAndCount.length > 1) {
                    int rowCount = Math.max(0, rowStartIdxAndCount[1]);

                    if (rowCount > 0) {
                        query.setMaxResults(rowCount);
                    }
                }
            }

            return query.getResultList();
        } catch (RuntimeException re) {
            EntityManagerHelper.log("find by property name failed",
                Level.SEVERE, re);
            throw re;
        }
    }

    public List<SubactividadPorActividad> findByAmbitosdeasignacion2(
        Object ambitosdeasignacion2, int... rowStartIdxAndCount) {
        return findByProperty(AMBITOSDEASIGNACION2, ambitosdeasignacion2,
            rowStartIdxAndCount);
    }

    public List<SubactividadPorActividad> findByAmbitosdeasignacion2(
        Object ambitosdeasignacion2) {
        return findByProperty(AMBITOSDEASIGNACION2, ambitosdeasignacion2);
    }

    public List<SubactividadPorActividad> findByAmbitosdeasignacionenpf(
        Object ambitosdeasignacionenpf, int... rowStartIdxAndCount) {
        return findByProperty(AMBITOSDEASIGNACIONENPF, ambitosdeasignacionenpf,
            rowStartIdxAndCount);
    }

    public List<SubactividadPorActividad> findByAmbitosdeasignacionenpf(
        Object ambitosdeasignacionenpf) {
        return findByProperty(AMBITOSDEASIGNACIONENPF, ambitosdeasignacionenpf);
    }

    public List<SubactividadPorActividad> findByDefectosdealtaseveridad(
        Object defectosdealtaseveridad, int... rowStartIdxAndCount) {
        return findByProperty(DEFECTOSDEALTASEVERIDAD, defectosdealtaseveridad,
            rowStartIdxAndCount);
    }

    public List<SubactividadPorActividad> findByDefectosdealtaseveridad(
        Object defectosdealtaseveridad) {
        return findByProperty(DEFECTOSDEALTASEVERIDAD, defectosdealtaseveridad);
    }

    public List<SubactividadPorActividad> findByDefectosentregados(
        Object defectosentregados, int... rowStartIdxAndCount) {
        return findByProperty(DEFECTOSENTREGADOS, defectosentregados,
            rowStartIdxAndCount);
    }

    public List<SubactividadPorActividad> findByDefectosentregados(
        Object defectosentregados) {
        return findByProperty(DEFECTOSENTREGADOS, defectosentregados);
    }

    public List<SubactividadPorActividad> findByDefectosentregados2(
        Object defectosentregados2, int... rowStartIdxAndCount) {
        return findByProperty(DEFECTOSENTREGADOS2, defectosentregados2,
            rowStartIdxAndCount);
    }

    public List<SubactividadPorActividad> findByDefectosentregados2(
        Object defectosentregados2) {
        return findByProperty(DEFECTOSENTREGADOS2, defectosentregados2);
    }

    public List<SubactividadPorActividad> findByEliminaciondedefectos(
        Object eliminaciondedefectos, int... rowStartIdxAndCount) {
        return findByProperty(ELIMINACIONDEDEFECTOS, eliminaciondedefectos,
            rowStartIdxAndCount);
    }

    public List<SubactividadPorActividad> findByEliminaciondedefectos(
        Object eliminaciondedefectos) {
        return findByProperty(ELIMINACIONDEDEFECTOS, eliminaciondedefectos);
    }

    public List<SubactividadPorActividad> findByFechaestimadasubactFin(
        Object fechaestimadasubactFin, int... rowStartIdxAndCount) {
        return findByProperty(FECHAESTIMADASUBACTFIN, fechaestimadasubactFin,
            rowStartIdxAndCount);
    }

    public List<SubactividadPorActividad> findByFechaestimadasubactFin(
        Object fechaestimadasubactFin) {
        return findByProperty(FECHAESTIMADASUBACTFIN, fechaestimadasubactFin);
    }

    public List<SubactividadPorActividad> findByFechaestimadasubactInicio(
        Object fechaestimadasubactInicio, int... rowStartIdxAndCount) {
        return findByProperty(FECHAESTIMADASUBACTINICIO,
            fechaestimadasubactInicio, rowStartIdxAndCount);
    }

    public List<SubactividadPorActividad> findByFechaestimadasubactInicio(
        Object fechaestimadasubactInicio) {
        return findByProperty(FECHAESTIMADASUBACTINICIO,
            fechaestimadasubactInicio);
    }

    public List<SubactividadPorActividad> findByFechalimiteestimada(
        Object fechalimiteestimada, int... rowStartIdxAndCount) {
        return findByProperty(FECHALIMITEESTIMADA, fechalimiteestimada,
            rowStartIdxAndCount);
    }

    public List<SubactividadPorActividad> findByFechalimiteestimada(
        Object fechalimiteestimada) {
        return findByProperty(FECHALIMITEESTIMADA, fechalimiteestimada);
    }

    public List<SubactividadPorActividad> findById(Object id,
        int... rowStartIdxAndCount) {
        return findByProperty(ID, id, rowStartIdxAndCount);
    }

    public List<SubactividadPorActividad> findById(Object id) {
        return findByProperty(ID, id);
    }

    public List<SubactividadPorActividad> findByIndicedeproduccionpf(
        Object indicedeproduccionpf, int... rowStartIdxAndCount) {
        return findByProperty(INDICEDEPRODUCCIONPF, indicedeproduccionpf,
            rowStartIdxAndCount);
    }

    public List<SubactividadPorActividad> findByIndicedeproduccionpf(
        Object indicedeproduccionpf) {
        return findByProperty(INDICEDEPRODUCCIONPF, indicedeproduccionpf);
    }

    public List<SubactividadPorActividad> findByIndicedeproduccionpf2(
        Object indicedeproduccionpf2, int... rowStartIdxAndCount) {
        return findByProperty(INDICEDEPRODUCCIONPF2, indicedeproduccionpf2,
            rowStartIdxAndCount);
    }

    public List<SubactividadPorActividad> findByIndicedeproduccionpf2(
        Object indicedeproduccionpf2) {
        return findByProperty(INDICEDEPRODUCCIONPF2, indicedeproduccionpf2);
    }

    public List<SubactividadPorActividad> findByIndiceincrementocambiomensual(
        Object indiceincrementocambiomensual, int... rowStartIdxAndCount) {
        return findByProperty(INDICEINCREMENTOCAMBIOMENSUAL,
            indiceincrementocambiomensual, rowStartIdxAndCount);
    }

    public List<SubactividadPorActividad> findByIndiceincrementocambiomensual(
        Object indiceincrementocambiomensual) {
        return findByProperty(INDICEINCREMENTOCAMBIOMENSUAL,
            indiceincrementocambiomensual);
    }

    public List<SubactividadPorActividad> findByPotencialdedefectos1(
        Object potencialdedefectos1, int... rowStartIdxAndCount) {
        return findByProperty(POTENCIALDEDEFECTOS1, potencialdedefectos1,
            rowStartIdxAndCount);
    }

    public List<SubactividadPorActividad> findByPotencialdedefectos1(
        Object potencialdedefectos1) {
        return findByProperty(POTENCIALDEDEFECTOS1, potencialdedefectos1);
    }

    public List<SubactividadPorActividad> findByPotencialdedefectos2(
        Object potencialdedefectos2, int... rowStartIdxAndCount) {
        return findByProperty(POTENCIALDEDEFECTOS2, potencialdedefectos2,
            rowStartIdxAndCount);
    }

    public List<SubactividadPorActividad> findByPotencialdedefectos2(
        Object potencialdedefectos2) {
        return findByProperty(POTENCIALDEDEFECTOS2, potencialdedefectos2);
    }

    public List<SubactividadPorActividad> findByProbabilidaddereparacionesdefectuosas(
        Object probabilidaddereparacionesdefectuosas, int... rowStartIdxAndCount) {
        return findByProperty(PROBABILIDADDEREPARACIONESDEFECTUOSAS,
            probabilidaddereparacionesdefectuosas, rowStartIdxAndCount);
    }

    public List<SubactividadPorActividad> findByProbabilidaddereparacionesdefectuosas(
        Object probabilidaddereparacionesdefectuosas) {
        return findByProperty(PROBABILIDADDEREPARACIONESDEFECTUOSAS,
            probabilidaddereparacionesdefectuosas);
    }

    public List<SubactividadPorActividad> findByReutilizacion(
        Object reutilizacion, int... rowStartIdxAndCount) {
        return findByProperty(REUTILIZACION, reutilizacion, rowStartIdxAndCount);
    }

    public List<SubactividadPorActividad> findByReutilizacion(
        Object reutilizacion) {
        return findByProperty(REUTILIZACION, reutilizacion);
    }

    public List<SubactividadPorActividad> findByTamanoderequisitosencasosdeuso(
        Object tamanoderequisitosencasosdeuso, int... rowStartIdxAndCount) {
        return findByProperty(TAMANODEREQUISITOSENCASOSDEUSO,
            tamanoderequisitosencasosdeuso, rowStartIdxAndCount);
    }

    public List<SubactividadPorActividad> findByTamanoderequisitosencasosdeuso(
        Object tamanoderequisitosencasosdeuso) {
        return findByProperty(TAMANODEREQUISITOSENCASOSDEUSO,
            tamanoderequisitosencasosdeuso);
    }

    public List<SubactividadPorActividad> findByTamanoinicialdesubactv1(
        Object tamanoinicialdesubactv1, int... rowStartIdxAndCount) {
        return findByProperty(TAMANOINICIALDESUBACTV1, tamanoinicialdesubactv1,
            rowStartIdxAndCount);
    }

    public List<SubactividadPorActividad> findByTamanoinicialdesubactv1(
        Object tamanoinicialdesubactv1) {
        return findByProperty(TAMANOINICIALDESUBACTV1, tamanoinicialdesubactv1);
    }

    public List<SubactividadPorActividad> findByTamanoinicialdesubactv2(
        Object tamanoinicialdesubactv2, int... rowStartIdxAndCount) {
        return findByProperty(TAMANOINICIALDESUBACTV2, tamanoinicialdesubactv2,
            rowStartIdxAndCount);
    }

    public List<SubactividadPorActividad> findByTamanoinicialdesubactv2(
        Object tamanoinicialdesubactv2) {
        return findByProperty(TAMANOINICIALDESUBACTV2, tamanoinicialdesubactv2);
    }

    public List<SubactividadPorActividad> findByVolumenesdegraficos(
        Object volumenesdegraficos, int... rowStartIdxAndCount) {
        return findByProperty(VOLUMENESDEGRAFICOS, volumenesdegraficos,
            rowStartIdxAndCount);
    }

    public List<SubactividadPorActividad> findByVolumenesdegraficos(
        Object volumenesdegraficos) {
        return findByProperty(VOLUMENESDEGRAFICOS, volumenesdegraficos);
    }

    /**
     * Find all SubactividadPorActividad entities.
     *
     * @param rowStartIdxAndCount
     *            Optional int varargs. rowStartIdxAndCount[0] specifies the the
     *            row index in the query result-set to begin collecting the
     *            results. rowStartIdxAndCount[1] specifies the the maximum
     *            count of results to return.
     * @return List<SubactividadPorActividad> all SubactividadPorActividad entities
     */
    @SuppressWarnings("unchecked")
    public List<SubactividadPorActividad> findAll(
        final int... rowStartIdxAndCount) {
        EntityManagerHelper.log("finding all SubactividadPorActividad instances",
            Level.INFO, null);

        try {
            final String queryString = "select model from SubactividadPorActividad model";
            Query query = getEntityManager().createQuery(queryString);

            if ((rowStartIdxAndCount != null) &&
                    (rowStartIdxAndCount.length > 0)) {
                int rowStartIdx = Math.max(0, rowStartIdxAndCount[0]);

                if (rowStartIdx > 0) {
                    query.setFirstResult(rowStartIdx);
                }

                if (rowStartIdxAndCount.length > 1) {
                    int rowCount = Math.max(0, rowStartIdxAndCount[1]);

                    if (rowCount > 0) {
                        query.setMaxResults(rowCount);
                    }
                }
            }

            return query.getResultList();
        } catch (RuntimeException re) {
            EntityManagerHelper.log("find all failed", Level.SEVERE, re);
            throw re;
        }
    }

    public List<SubactividadPorActividad> findByCriteria(String whereCondition) {
        try {
            String where = ((whereCondition == null) ||
                (whereCondition.length() == 0)) ? "" : ("where " +
                whereCondition);

            final String queryString = "select model from SubactividadPorActividad model " +
                where;

            Query query = getEntityManager().createQuery(queryString);

            List<SubactividadPorActividad> entitiesList = query.getResultList();

            return entitiesList;
        } catch (RuntimeException re) {
            EntityManagerHelper.log("find By Criteria in SubactividadPorActividad failed",
                Level.SEVERE, re);
            throw re;
        }
    }

    public List<SubactividadPorActividad> findPageSubactividadPorActividad(
        String sortColumnName, boolean sortAscending, int startRow,
        int maxResults) {
        if ((sortColumnName != null) && (sortColumnName.length() > 0)) {
            try {
                String queryString = "select model from SubactividadPorActividad model order by model." +
                    sortColumnName + " " + (sortAscending ? "asc" : "desc");

                return getEntityManager().createQuery(queryString)
                           .setFirstResult(startRow).setMaxResults(maxResults)
                           .getResultList();
            } catch (RuntimeException re) {
                throw re;
            }
        } else {
            try {
                String queryString = "select model from SubactividadPorActividad model";

                return getEntityManager().createQuery(queryString)
                           .setFirstResult(startRow).setMaxResults(maxResults)
                           .getResultList();
            } catch (RuntimeException re) {
                throw re;
            }
        }
    }

    @SuppressWarnings("unchecked")
    public Long findTotalNumberSubactividadPorActividad() {
        try {
            String queryString = "select count(*) from SubactividadPorActividad model";

            return (Long) getEntityManager().createQuery(queryString)
                              .getSingleResult();
        } catch (RuntimeException re) {
            throw re;
        }
    }
}
